#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include  <malloc.h>
#include <sched.h>
#include "include/jp2.h"


int main(){

struct t_info buff;
char param[10];
int pid;
int status=-1;
int pidhijo;
int fd;
int ioct;
int closerr;
int opinc;
int pid2;

printf("Juego de pruebas modulo 2(PROSO)\n");
fflush(stdout);
printf("Comienza el juego de pruebas del pid: ");
fflush(stdout);

system("mknod /dev/modulo2 c 253 0");

pid=getpid();
pidhijo=fork();
if(pidhijo==0){

	pidhijo=fork();
	if(pidhijo==0){
		sprintf(param,"insmod mymodule.ko pid=%d",pid);
		system(param);
		exit(0);
	}

wait(&status);
printf("%d\n",pid);
system("insmod mymodule2.ko");
}

else{
wait(&status);

//probamos tres writes correctos
printf("Hacemos 3 writes.\n");
write(1,"write:\n",7);
write(1,"write:\n",7);
write(1,"write:\n",7);

// Open incorrecto
printf("Hacemos 1 Open incorrecto.\n");
open("hola.txt",0);
// Close incorrecto
printf("Hacemos 1 Close incorrecto.\n");
close(4);

// 2 lseek incorrectos
printf("Hacemos 2 lseek incorrectos.\n\n");
lseek(4, 1, SEEK_SET);
lseek(4,1,0);

printf("-Abrir el dispositivo: ");
fd=open("/dev/modulo2",O_RDONLY);
if(fd<0){printf("Error abriendo el dispositivo\n");}
else{
printf("OK\n");

printf("-Abrir el dispositivo otra vez: ");
opinc=open("/dev/modulo2",O_RDONLY);
if(opinc<0){printf("Error abriendo el dispositivo\n");}

printf("-Activar monitorización: ");
ioct=ioctl(fd,4,-1);
if(ioct<0){printf("Error activar monitorizacion %d\n", ioct);}

printf("OK\n-Lectura estadísticas Open: ");
read(fd,&buff,sizeof(struct t_info));
printf("OK\nEstadísticas Open:\n");
printf("OPEN:");
printf("	Numero entrades: %d\n",buff.num_entrades);
printf("	Sortides correctes: %d\n",buff.num_sortides_ok);
printf("	Sortides incorrectes: %d\n",buff.num_sortides_error);
printf("	Tiempo total: %d\n\n",buff.durada_total);

printf("-Cambio de proceso incorrecto(%d): ",pid+1);
ioct=ioctl(fd,0,&(pid2));
if(ioct<0){printf("OK\n");}
else{printf("Error este ioctl debe ser incorrecto\n");}


switch(fork()){

	case 0: printf("-Cambio de proceso correcto(%d): ",getpid());
		pid2=getpid();
		ioct=ioctl(fd,0,&pid2);
		if(ioct>=0){printf("OK\n");}
		else{printf("Error cambio de proceso\n");}
		exit(0);

	default: wait(&status);
		 printf("-Restauramos al proceso padre(%d): ",pid);
		 ioct=ioctl(fd,0,&pid);
		 if(ioct>=0){printf("OK\n");}
		 else{printf("Error restaurando el proceso padre\n");}

}

printf("-Cambio de syscall correcto(Lseek): ");
ioct=ioctl(fd,1,2);
if(ioct<0){printf("Error de ioctl2%d\n", ioct);}
else{printf("OK\n");}

printf("Lectura estadísticas Lseek: ");
read(fd,&buff,sizeof(struct t_info));
printf("OK\nEstadísticas Lseek:\n");
printf("LSEEK:");
printf("	Numero entrades: %d\n",buff.num_entrades);
printf("	Sortides correctes: %d\n",buff.num_sortides_ok);
printf("	Sortides incorrectes: %d\n",buff.num_sortides_error);
printf("	Tiempo total: %d\n\n",buff.durada_total);

printf("-Cambio de syscall correcto(Close)\n");
ioct=ioctl(fd,1,3);
if(ioct<0){printf("Error de ioctl2%d\n", ioct);}

printf("Lectura estadísticas Close: ");
read(fd,&buff,sizeof(struct t_info));
printf("OK\nEstadísticas Close:\n");
printf("CLOSE:");
printf("	Numero entrades: %d\n",buff.num_entrades);
printf("	Sortides correctes: %d\n",buff.num_sortides_ok);
printf("	Sortides incorrectes: %d\n",buff.num_sortides_error);
printf("	Tiempo total: %d\n\n",buff.durada_total);

printf("-Cambio de syscall correcto(Clone)\n");
ioct=ioctl(fd,1,4);
if(ioct<0){ printf("Error de ioctl3%d\n", ioct);}

printf("Lectura estadísticas Clone: ");
read(fd,&buff,sizeof(struct t_info));
printf("OK\nEstadísticas Clone:\n");
printf("CLONE:");
printf("	Numero entrades: %d\n",buff.num_entrades);
printf("	Sortides correctes: %d\n",buff.num_sortides_ok);
printf("	Sortides incorrectes: %d\n",buff.num_sortides_error);
printf("	Tiempo total: %d\n\n",buff.durada_total);

printf("-Cambio de syscall correcto(Lseek)\n");
ioct=ioctl(fd,1,2);
if(ioct<0) printf("Error de ioctl4%d\n", ioct);


printf("-Reset estadísticas proceso actual: ");
ioct=ioctl(fd,2,0);
if(ioct<0){ printf("Error de ioctl5%d\n", ioct);}
else{printf("OK\n");}

/*
printf("-Reset valores todos los procesos: ");
ioct=ioctl(fd,3,0);
if(ioct<0) printf("Error de ioctl5%d\n", ioct);
else{printf("OK\n");}*/

printf("Lectura estadísticas Lseek: ");
read(fd,&buff,sizeof(struct t_info));
printf("OK\nEstadísticas Lseek(Todo a 0):\n");
printf("LSEEK:");
printf("	Numero entrades: %d\n",buff.num_entrades);
printf("	Sortides correctes: %d\n",buff.num_sortides_ok);
printf("	Sortides incorrectes: %d\n",buff.num_sortides_error);
printf("	Tiempo total: %d\n\n",buff.durada_total);

// Desactivamos la monitorización
printf("-Desactivar monitorización: ");
ioct=ioctl(fd,5,-1);
if(ioct<0){printf("Error de ioctl5%d\n", ioct);}
else{printf("OK\n");}

printf("-Hacemos 2 Lseek incorrectos\n");
lseek(4, 1, SEEK_SET);
lseek(4,1,0);

printf("Lectura estadísticas Lseek: ");
read(fd,&buff,sizeof(struct t_info));
printf("OK\nEstadísticas Lseek(Todo a 0):\n");
printf("LSEEK:");
printf("	Numero entrades: %d\n",buff.num_entrades);
printf("	Sortides correctes: %d\n",buff.num_sortides_ok);
printf("	Sortides incorrectes: %d\n",buff.num_sortides_error);
printf("	Tiempo total: %d\n\n",buff.durada_total);

// Reactivamos la monitorización
printf("-Reactivar monitorización: ");
ioct=ioctl(fd,4,-1);
if(ioct<0){printf("Error de ioctl5%d\n", ioct);}
else{printf("OK\n");}

printf("-Hacemos 2 Lseek incorrectos\n");
lseek(4, 1, SEEK_SET);
lseek(4,1,0);

printf("Lectura estadísticas Lseek: ");
read(fd,&buff,sizeof(struct t_info));
printf("OK\nEstadísticas Lseek(Todo a 0):\n");
printf("LSEEK:");
printf("	Numero entrades: %d\n",buff.num_entrades);
printf("	Sortides correctes: %d\n",buff.num_sortides_ok);
printf("	Sortides incorrectes: %d\n",buff.num_sortides_error);
printf("	Tiempo total: %d\n\n",buff.durada_total);

printf("-Desactivar monitorización: ");
ioct=ioctl(fd,5,-1);
if(ioct<0){printf("Error de ioctl5%d\n", ioct);}
else{printf("OK\n");}

printf("Cerramos el canal: ");
closerr=close(fd);
if(closerr<0){printf("Error cerrando el dispositivo\n");}
else{printf("OK\n");}

fflush(stdout);
printf("FIN DEL JUEGO DE PRUEBAS\n");


}
pidhijo=fork();
	if(pidhijo==0){
		system("rmmod mymodule2.ko");
		exit(0);
	}

wait(&status);
system("rm /dev/modulo2");
system("rmmod mymodule.ko");
}
}















     
